//package cn.xxy;
//
//import cn.xxy.beans.DataSourceConfig;
//import cn.xxy.exception.DataAccessException;
//import cn.xxy.exception.ExecuteParamsException;
//import cn.xxy.result.*;
//
//import javax.sql.DataSource;
//import java.sql.*;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//public class JDbHelper extends DbHelper {
//	public JDbHelper(DataSourceConfig dsc) {
//	super(dsc);
//	}
//	public JDbHelper(String dbName){
//		super(dbName);
//	}
//	/**
//	 * 查询单个对象
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param params sql 参数
//	 */
//	@Override
//	public <T> T queryObject(Connection conn, String sql, Object... params) throws SQLException {
//		return executeQuery(conn, sql, new ColumnHandler<T>(1), params);
//	}
//
//	/**
//	 * 查询第一行数据并封装为实体类返回
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param clazz 实体类型
//	 * @param params sql 参数
//	 */
//	@Override
//	public <T> T queryBean(Connection conn, String sql, Class<T> clazz, Object... params) throws SQLException {
//		return executeQuery(conn, sql, new BeanHandler<T>(clazz), params);
//	}
//
//	/**
//	 * 查询第一行数据并封装为 <code>Object[]</code> 返回
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param params sql 参数
//	 * @return 无数据时返回空数组（<code>new Object[0]</code>）
//	 */
//	@Override
//	public Object[] queryRowArray(Connection conn, String sql, Object... params) throws SQLException {
//		Object[] result = executeQuery(conn, sql, new ArrayHandler(), params);
//		return result == null ? new Object[0] : result;
//	}
//
//
//	/**
//	 * 查询第一行数据并封装为 <code>Map&lt;String, Object&gt;</code> 返回
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param params sql 参数
//	 * @return 无数据时返回空Map（<code>new HashMap&lt;&gt;()</code>）
//	 */
//	@Override
//	public Map<String, Object> queryRowMap(Connection conn, String sql, Object... params) throws SQLException {
//		Map<String, Object> result =  executeQuery(conn, sql, new MapHandler(), params);
//		return result == null ? new HashMap<String, Object>() : result;
//	}
//
//	/**
//	 * 查询第一列数据
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param params sql 参数
//	 */
//	@Override
//	public <T> List<T> queryColList(Connection conn, String sql, Object... params) throws SQLException {
//		return executeQuery(conn, sql, new ColumnListHandler<T>(), params);
//	}
//	/**
//	 * 查询数据并封装为 <code>List&lt;Map&lt;String, Object&gt;&gt;</code> 返回
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param params sql 参数
//	 */
//	@Override
//	public List<Map<String, Object>> queryListMap(Connection conn, String sql, Object... params) throws SQLException {
//		return executeQuery(conn, sql, new MapListHandler(), params);
//	}
//	/**
//	 * 查询数据并封装为 <code>List&lt;Object[]&gt;</code> 返回
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param params sql 参数
//	 */
//	@Override
//	public List<Object[]> queryListArray(Connection conn, String sql, Object... params) throws SQLException {
//		return executeQuery(conn, sql, new ArrayListHandler(), params);
//	}
//
//	/**
//	 * 查询数据并封装为 <code>List&lt;T&gt;</code> 返回
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param clazz 实体类型
//	 * @param params sql 参数
//	 */
//	@Override
//	public <T> List<T> queryListBean(Connection conn, String sql, Class<T> clazz, Object... params) throws SQLException {
//		return executeQuery(conn, sql, new BeanListHandler<T>(clazz), params);
//	}
//
//	/**
//	 * 查询数据并封装为 <code>Map&lt;K, Map&lt;String, Object&gt;&gt;</code> 返回
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param keyedCol 键列列名
//	 * @param params sql 参数
//	 * @return 无数据时返回空Map（<code>new HashMap&lt;&gt;()</code>）
//	 */
//	@Override
//	public <K> Map<K, Map<String, Object>> queryKeyedMap(Connection conn, String sql, String keyedCol, Object... params) throws SQLException {
//		Map<K, Map<String, Object>> result = executeQuery(conn, sql, new KeyedHandler<K>(keyedCol), params);
//		return result == null ? new HashMap<K, Map<String, Object>>() : result;
//	}
//
//	/**
//	 * 查询数据并封装为 <code>Map&lt;K, B&gt;</code> 返回
//	 * @param conn 数据库连接
//	 * @param sql sql 语句
//	 * @param clazz 实体类型
//	 * @param keyedCol 键列列名
//	 * @param params sql 参数
//	 * @return 无数据时返回空Map（<code>new HashMap&lt;&gt;()</code>）
//	 */
//	@Override
//	public <K, B> Map<K, B> queryKeyedBean(Connection conn, String sql, Class<B> clazz, String keyedCol, Object... params) throws SQLException {
//		Map<K, B> result = executeQuery(conn, sql, new BeanMapHandler<K, B>(clazz, keyedCol), params);
//		return result == null ? new HashMap<K, B>() : result;
//	}
//	/**
//	 * 执行Sql语句
//	 * @param connection 数据库连接
//	 * @param sql sql 语句
//	 * @param params sql 参数
//	 * @return 修改的行数
//	 */
//	@Override
//	public int executeUpdate(Connection connection, String sql, Object... params) throws SQLException {
//		if(connection == null) {
//			throw new ExecuteParamsException("Null connection.");
//		}
//		if(sql == null) {
//			closeConns(connection);
//			throw new ExecuteParamsException("Null SQL statement.");
//		}
//		//声明PreparedStatement对象
//		PreparedStatement ps = null;
//		try {
//			//预编译发送sql
//			ps = connection.prepareStatement(sql);
//			//设置参数
//			setParameters(ps, params);
//			//执行sql
//			return ps.executeUpdate();
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			close(ps);
//			if (connection.getAutoCommit()) {
//				closeConns(connection);
//			}
//		}
//	}
//
//	/**
//	 * 查询
//	 * @param sql sql语句
//	 * @param handler 结果集处理器
//	 * @param params sql所需的参数
//	 * @param <T> 具体结果类型
//	 * @return 查询结果集
//	 */
//	protected  <T> T executeQuery(Connection connection,String sql, ResultSetHandler<T> handler,
//								  Object...params) throws SQLException {
//		if(connection == null) {
//			throw new ExecuteParamsException("Null connection.");
//		}
//		if(sql == null) {
//			closeConns(connection);
//			throw new ExecuteParamsException("Null SQL statement.");
//		}
//		if(handler == null) {
//			closeConns(connection);
//			throw new ExecuteParamsException("Null ResultSetHandler.");
//		}
//		PreparedStatement ps = null;
//		ResultSet rs = null;
//		//返回的数据
//		T t = null;
//		try {
//			ps = connection.prepareStatement(sql);
//			//设置参数
//			setParameters(ps, params);
//			//执行查询
//			rs = ps.executeQuery();
//			//将结果集传给handler处理转换
//			t = handler.handle(rs);
//			return t;
//		} catch(SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			close(rs);
//			close(ps);
//			if (connection.getAutoCommit()) {
//				closeConns(connection);
//			}
//		}
//	}
//}
